-- Keymaps are automatically loaded on the VeryLazy event
-- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua
-- Add any additional keymaps here

-- local Util = require("lazyvim.util")

-- local function map(mode, lhs, rhs, opts)
-- local keys = require("lazy.core.handler").handlers.keys
-- ---@cast keys LazyKeysHandler
-- -- do not create the keymap if a lazy keys handler exists
-- if not keys.active[keys.parse({ lhs, mode = mode }).id] then
-- opts = opts or {}
-- opts.silent = opts.silent ~= false
-- vim.keymap.set(mode, lhs, rhs, opts)
-- end
-- end

-- -- map("n", "<leader>h", "<cmd>noh<cr>", { desc = "Disable all highlights" })
-- map("n", "<C-\\>", function()
-- Util.float_term(nil, { cwd = Util.get_root() })
-- end, { desc = "Terminal (root dir)" })

-- load refactoring Telescope extension
-- require("telescope").load_extension("refactoring")

-- remap to open the Telescope refactoring menu in visual mode
-- vim.api.nvim_set_keymap(
--   "v",
--   "<leader>rr",
--   "<Esc><cmd>lua require('telescope').extensions.refactoring.refactors()<CR>",
--   { noremap = true }
-- )

local function map(mode, lhs, rhs, opts)
  local options = { noremap = true }
  if opts then
    options = vim.tbl_extend("force", options, opts)
  end
  vim.api.nvim_set_keymap(mode, lhs, rhs, options)
end

local opts = { noremap = true, silent = true }

-- vim.cmd('let mapleader=" "')

-- vim.o.relativenumber = true
-- vim.o.number = true
-- --vim.o.noexpandtab = true
-- vim.o.softtabstop = 2
-- vim.o.showtabline = 2
-- vim.o.termguicolors = true
-- vim.o.cursorline = true
-- vim.o.mouse = "a"
-- vim.o.scrolloff = 4
-- vim.o.expandtab = true
-- vim.o.smartindent = false
-- vim.o.autoindent = false
-- vim.o.tabstop = 2
-- vim.o.shiftwidth = 2
-- vim.o.wildmenu = true
-- vim.o.ignorecase = true
-- vim.o.swapfile = true

-- -- 中文乱码
-- vim.o.regexpengine = 1
-- vim.o.termencoding = "UTF-8"
-- vim.o.encoding = "UTF-8"
-- vim.o.fileencodings = "UTF8,UCS-BOM,GBK,CP936,GB2312,GB18030"

-- vim.o.wrap = true
-- vim.o.re = 0
-- vim.o.tw = 0
-- vim.o.foldmethod = "expr"
-- vim.o.foldexpr = "nvim_treesitter#foldexpr()"
-- vim.o.foldenable = false
-- vim.o.foldlevel = 99
vim.opt.clipboard = "unnamed"

-- vim.o.splitright = true
-- vim.o.splitbelow = true
-- --vim.o.noshowmode = true
-- vim.o.showcmd = true
-- vim.o.ignorecase = true
-- vim.o.smartcase = true
-- vim.o.inccommand = "split"

-- vim.o.t_Co = 256
-- vim.o.autoread = true
-- vim.o.ruler = true
-- vim.o.exrc = true
-- vim.o.secure = true
-- --vim.o.hidden = true
-- vim.o.list = true

--map('', '', '', {})

--
-- 插入新行
-- map('n', '<leader><CR>', 'i<CR><ESC>i', {})

-- New cursor movement (the default arrow keys are used for resizing windows)
--     ^
--     i
-- < j   l >
--     k
--     v
--
-- 插入
-- map("", "h", "i", {})
-- map("", "H", "I", {})

-- map("", "i", "k", {})
-- map("", "j", "h", {})
-- map("", "k", "j", {})
-- map("", "l", "l", {})
map("", "H", "5h", {})
map("", "J", "5j", {})
map("", "K", "5k", {})
map("", "L", "5l", {})
map("", "<C-k>", "5<C-y>", {})
map("", "<C-j>", "5<C-e>", {})

--移动窗口位置
map("", "<leader>k", "<C-w>k", {})
map("", "<leader>j", "<C-w>j", {})
map("", "<leader>h", "<C-w>h", {})
map("", "<leader>l", "<C-w>l", {})

-- 调整窗口大小
map("", "<A-up>", ":res -5<CR>", {})
map("", "<A-down>", ":res +5<CR>", {})
map("", "<A-left>", ":vertical resize-5<CR>", {})
map("", "<A-right>", ":vertical resize+5<CR>", {})

-- split the screens to up (horizontal), down (horizontal), left (vertical), right (vertical)
map("n", "sh", ":vsp<CR>:set splitright<CR>")
map("n", "sl", ":vsp<CR>")
map("n", "sk", ":sp<CR>:set splitbelow<CR>")
map("n", "sj", ":sp<CR>")
map("n", "sc", "<C-w>c")
-- map("n", "so", "<C-w>o") -- close others

-- Place the two screens up and down
map("", "ss", "<C-w>t<C-w>K", {})
-- Place the two screens side by side
map("", "sv", "<C-w>t<C-w>H", {})

-- 光标跳转至行首
map("", "E", "^", {})
-- 光标跳转至行尾
map("", "B", "$", {})

-- 取消高亮
-- map('', '<leader>/', ':noh<CR>')

-- 缩进管理
map("n", "<", "<<", {})
map("n", ">", ">>", {})

map("n", ";", ":", {})

-- Shortcut for quiting and saving
map("", "Q", ":q!<cr>", {})
map("", "<C-s>", ":w<cr>", {})
map("", "zz", ":wq<cr>", {})

-- About buffers
-- map('n', ',,', ':vsp<cr>', {})
-- map('n', '<leader>[]', ':tabedit<cr>', {})
--map('n', 'H', '<c-w>h', {})
--map('n', 'I', '<c-w>l', {})

-- Quickly edit the configuration
-- map('n', '<leader>fs', ':tabedit ~/.config/nvim/lua/plugins.lua<cr>', {})

-- Copy and Past from the system clipboard
map("v", "Y", '"+y', {})
--map('n', 'P', '"+p', {})
map("n", "<C-z>", "u", {})
map("n", "<C-y>", "<C-r>", {})

-- 全选
map("n", "<C-a>", "ggVG", { silent = true })

-- 选择单词
map("", "W", "viw", {})

-- 无效按键
map("", "u", "<nop>", {})
map("", "s", "<nop>", {})
map("", "S", "<nop>", {})

-- 插件管理
-- map("", "<leader>pi", ":PackerInstall<CR>", {})
-- map("", "<leader>pu", ":PackerSync<CR>", {})
-- map("", "<leader>pc", ":PackerClean<CR>", {})

map("", "<leader>pp", ":Lazy<CR>", {})

-- 标签移动/关闭
-- map('', 'sd', ':bp<CR>', {})
-- map('', 'sa', ':bn<CR>', {})
-- map('', 'sc', ':bd<CR>', {})

-- 保存root权限文件
map("", "ws", ":w !sudo tee %<cr>", {})

-- Some functional configuration
map("n", "<backspace>", ":noh<cr>", {}) -- cancel highlight that from search
--map('n', '<space>', 'viw', {})        -- select a word
--map('n', '-', '@q', {})           -- play the macro 'q'

-- Open Terminal
-- vim.cmd('autocmd TermOpen term://* startinsert')
-- map('n', '<leader>T', ':term<CR>', {})

-- Open Lazygit
map("n", "<C-g>", ":FloatermNew --height=0.95 --width=0.95 lazygit<CR>", {})

-- 执行宏录制
map("", "<space>qw", ":normal @", {})

-- 开始宏录制:qx

--
--require('conf.barbar')

-- 浮动终端
map("n", "<F9>", ":FloatermNew<CR>", {})
map("t", "<F9>", "<C-\\><C-n>:FloatermNew<CR>", {})
map("n", "<F10>", ":FloatermPrev<CR>", {})
map("t", "<F10>", "<C-\\><C-n>:FloatermPrev<CR>", {})
map("n", "<F11>", ":FloatermNext<CR>", {})
map("t", "<F11>", "<C-\\><C-n>:FloatermNext<CR>", {})
map("n", "<F12>", ":FloatermToggle<CR>", {})
map("t", "<F12>", "<C-\\><C-n>:FloatermToggle<CR>", {})

-- gitgutter
-- vim.cmd("let g:gitgutter_map_keys = 0")
vim.cmd("let g:gitgutter_map_keys = 0")
map("n", "gp", ":GitGutterPrevHunk<CR>", {})
map("n", "gn", ":GitGutterNextHunk<CR>", {})
map("n", "gv", ":GitGutterPreviewHunk<CR>", {})
map("n", "gu", ":GitGutterUndoHunk<CR>", {})
map("n", "gy", ":GitGutterDiffOrig<CR>", {})
map("n", "gf", ":GitGutterFold<CR>", {})

-- " nnoremap <c-h> <Replace-Shortcut>  :Farr<cr>
-- " nnoremap <c-h> <Replace-Shortcut>  :Farr<cr>
--
-- vim.cmd("let g:coq_settings = { 'keymap.jump_to_mark': '<leader>g' }")

-- 获得补全内容：ctrl+o
--

-- 'junegunn/vim-peekaboo' 使用"打开剪贴板

-- vim.cmd("hi Normal ctermfg=252 ctermbg=none")

-- vim.cmd('let g:python3_host_prog = "/usr/bin/python3"')

-- vim.cmd('set mouse+=a')

--vim.o.autochdir = true

-- vim.cmd('set term=xterm')
-- vim.cmd('set t_Co=256')
-- vim.cmd('let g:rehash256 = 1')

-- vim.cmd("syntax on")
-- vim.cmd("filetype plugin indent on")

-- vim.cmd('let autosave=30')
--vim.o.ttimeoutlen = 0
--vim.o.notimeout = true
-- vim.o.viewoptions = 'cursor,folds,slash,unix'
-- vim.o.completeopt = 'longest,noinsert,menuone,noselect,preview'

-- Markdown-Preview.nvim
--vim.g.mkdp_filetypes = { 'markdown' }
--vim.cmd('autocmd vimenter *.md exec ":MarkdownPreview"')

-- 记录光标位置
-- vim.cmd([[au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif']])
-- vim.cmd([[ autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif ]])

-- set nofoldenable
-- au BufRead * normal zR
-- autocmd BufWinEnter * silent! :%foldopen!
-- autocmd BufWinEnter * let &foldlevel = max(map(range(1, line('$')), 'foldlevel(v:val)'))
--
-- autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
-- vim.cmd('let g:lightline={ "enable": {"statusline": 1, "tabline": 0} }')
-- local map = vim.api.nvim_set_keymap

-- BufferLine使用快捷键
map("n", "sa", "<Cmd>BufferLineCyclePrev<CR>", {})
map("n", "sd", "<Cmd>BufferLineCycleNext<CR>", {})

map("n", "sp", "<Cmd>BufferLinePick<CR>", {})
-- map("n", "sb", "<Cmd>BufferLinePickClose<CR>", {})
map("n", "sb", ":bd<CR>", {})
map("n", "so", "<Cmd>BufferLineCloseOthers<CR>", {})

map("", "<F4>", ":Vista!!<CR>", {})
map("", "<C-t>", ":Vista finder<CR>", {})

--- Ranger
map("", "R", ":FloatermNew ranger<CR>", {})
--- 注释/反注释-使用mini-command
map("", "<F7>", "<plug>NERDCommenterToggle", {})

-- auto-format
map("", "<F6>", ":Autoformat<CR>", {})

-- nvim-tree
map("", "<F3>", ":Neotree<CR>", {})

map("n", "<leader>a", ":Far  %<left><left>", {})
map("n", "<c-f>", ":F <right>", {})
map("n", "<leader>d", ":Fardo<CR>", {})

-- Tabular
map("", ".", ":Tab /", {})

map("n", "se", ":VsnipOpenEdit<CR>", {})

--实现了trouble这种预览窗口类型（类似于quickfix, loclist），这种窗口的特点是切换项目时会将打开前的窗口实时预览到对应的位置上，
--退出trouble窗口时会回到原来的位置。
map("", "<F8>", ":TroubleToggle<CR>", {})

-- ekickx/clipboard-image.nvim
map("", "<C-v>", ":PasteImg<CR>", {})

vim.cmd([[
let g:vmt_auto_update_on_save = 1
]])

map("n", "tm", ":GenTocMarked<CR>", {})
map("n", "tu", ":UpdateToc<CR>", {})
map("n", "tr", ":RemoveToc<CR>", {})
